"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 18、电子商务产品实战.py
"""

"""
产品分析
测试用例分析
编写脚本
脚本优化
生成测试报告
http://litemall.hogwarts.ceshiren.com/#/login?redirect=%2Fdashboard
manage   manage123
"""

"""
添加商品：
    前提条件：
        1. 登录并进入用户管理后台
        2. 登录账号有商场管理的权限
    用例步骤：
        1. 点击增加
        2. 输入类目名称
        3. 点击确定
    预期结果：
        1。 跳转商品类目列表
        2。 新增在最后一行，新增成功
    
删除商品：
     前提条件：
        1. 登录并进入用户管理后台
        2. 商品列表中有已存在的商品（新增）
    用例步骤：
        1. 点击删除按钮
    预期结果：
        1. 是否有删除成功提示
        2. 被删除的商品不存在商品类目列表展示    
"""

"""
编写用例基本思路：
    1. 编写与业务无关的前置后置动作
    2. 初步实现功能
        a. 编写登录步骤
        b. 分别实现两条用例，保证单步调通
        c. 执行测试类，保证一起执行成功
    3. 代码优化 ： 使用显式等待 替换 强制等待
    4. 完善细节 ： 日志 报告 截图
"""

# pytest .\18、电子商务产品实战.py --alluredir ./allure_report --clean-alluredir
# allure serve ./allure_report


import allure
import time
from selenium import webdriver
from selenium.webdriver.common.by import By


# 登录功能，新增功能，删除功能，整体调试
class TestLitemall:

    def setup_class(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)
        self.driver.get('http://litemall.hogwarts.ceshiren.com')
        # 先清空，在输入内容
        self.driver.find_element(By.CSS_SELECTOR, '[name="username"]').clear()
        self.driver.find_element(By.CSS_SELECTOR, '[name="username"]').send_keys('manage')

        self.driver.find_element(By.XPATH, '//input[@name="password"]').clear()
        self.driver.find_element(By.XPATH, '//input[@name="password"]').send_keys('manage123')
        # 点击登录按钮
        self.driver.find_element(By.CSS_SELECTOR, '.el-button--primary').click()

    def teardown_class(self):
        self.driver.quit()

    def get_screen(self):
        timestamp = int(time.time())
        # image_1651567095.PNG
        image_path = f'./image/image_{timestamp}.PNG'
        # 截图
        self.driver.save_screenshot(image_path)
        # 将 截图 放到 allure 报告中
        allure.attach.file(image_path, name='picture', attachment_type=allure.attachment_type.PNG)

    # 添加商品功能
    def test_add_merchandise(self):
        # 首页，点击商场管理
        self.driver.find_element(By.XPATH, '//*[text()="商场管理"]').click()
        # 点击商品类目 -> 进入商品类目页面
        self.driver.find_element(By.XPATH, '//*[text()="商品类目"]').click()

        # 点击添加
        self.driver.find_element(By.XPATH, '//span[text()="添加"]').click()
        time.sleep(3)
        # 输入类目名称 ： 拼接时间戳
        current_time = time.strftime('_%Y%m%d%H%M%S')
        send_text = 'test' + current_time
        # 定位的元素表达式存在多个值，只需要取第一个值，可以直接使用
        self.driver.find_element(By.CSS_SELECTOR, ".el-input__inner").send_keys('新增商品测试')
        # self.driver.find_element(By.XPATH,'//form/div[1]').send_keys(send_text)
        # self.driver.find_element(By.CSS_SELECTOR,'.el-form--label-left>div:nth-child(1)').send_keys(send_text)
        time.sleep(3)


        # 点击确定按钮
        self.driver.find_element(By.XPATH, '//span[text()="确定"]').click()
        # self.driver.find_element(By.CSS_SELECTOR,'.dialog-footer .el-button--primary').click()

        # 获取 实际结果
        # 使用 find_elements ，如果找不到元素，会返回空列表。 find_element ，如果找不到，会报错
        res_list = self.driver.find_elements(By.XPATH, "//*[text()='新增商品测试']")

        # 截图
        self.get_screen()

        # 断言产品新增后是否成功找到。如果找到，证明新增成功
        # 结果为 ['新增商品测试']
        print([i.text for i in res_list])

        # 清理环境 ： 删除用例生成的脏数据   - >  数据的清理一定要放在断言之后完成。否则会影响用例的断言结果
        self.driver.find_element(By.XPATH, "//*[text()='新增商品测试']/../..//*[text()='删除']").click()

        assert res_list != []
        assert '新增商品测试' in [i.text for i in res_list]

    # 删除商品功能
    def test_delete(self):
        # 首页，点击商场管理
        self.driver.find_element(By.XPATH, '//*[text()="商场管理"]').click()
        # 点击商品类目 -> 进入商品类目页面
        self.driver.find_element(By.XPATH, '//*[text()="商品类目"]').click()
        # 添加 ： 删除商品测试
        # 点击添加
        self.driver.find_element(By.XPATH, '//span[text()="添加"]').click()
        time.sleep(3)
        # 定位的元素表达式存在多个值，只需要取第一个值，可以直接使用
        self.driver.find_element(By.CSS_SELECTOR, ".el-input__inner").send_keys('删除商品测试')
        time.sleep(3)

        # 点击确定按钮
        self.driver.find_element(By.XPATH, '//span[text()="确定"]').click()

        # 点击删除按钮  : 通过 子元素 查找 父元素
        self.driver.find_element(By.XPATH, "//*[text()='删除商品测试']/../..//*[text()='删除']").click()
        time.sleep(3)

        # 断言 ： 删除之后，这个商品类目是否还能获取到。如果删除成功，则会消失
        res_list1 = self.driver.find_elements(By.XPATH, "//*[text()='删除商品测试']")
        # 截图
        self.get_screen()
        assert res_list1 == []
